import axios from 'axios'
// import base from '../../base.config'
import store from '../store'
import { Message } from 'element-ui'
/* eslint-disable */
// 环境的切换
if (process.env.NODE_ENV == 'development') {
    // axios.defaults.baseURL = base.pro
    // axios.defaults.baseURL = '/api'
} else if (process.env.NODE_ENV == 'production') {
    axios.defaults.baseURL = 'http://47.103.5.136:9889'
}
/** 
 * 提示函数 
 * 显示功能
 */
function startLoading() {
    // 开始加载
    Toast.loading({
        message: '加载中...',
        forbidClick: true,
        duration: 500
    });
}

function closeLoading() {
    // 关闭加载
    Toast.clear()
}

function tip(title) {
    Toast(title)
}

/** 
 * 请求失败后的错误统一处理 
 * @param {Number} status 请求失败的状态码
 */
const errorHandle = (status, other) => {
        // 状态码判断
        switch (status) {
            // // 401: 未登录状态，跳转登录页
            // case 401:
            //   tip('未登录')
            //   break
            // // 403 token过期
            // case 403:
            //   tip('登录过期，请重新登录')
            //   sessionStorage.removeItem('token')
            //   break
            // // 404请求不存在
            // case 404:
            //   tip('请求的资源不存在')
            //   break
            // case 500:
            //   tip('认证失败,请联系管理员喔~')
            //   break
            default:
            // tip('系统繁忙喔~')
                Message({
                message: other,
                type: 'warning'
            });
            break
        }
    }
    // 创建axios实例
var instance = axios.create({ timeout: 1000 * 10 })
    /** 
     * 请求拦截器 
     * 每次请求前，如果存在token则在请求头中携带token 
     */
instance.interceptors.request.use(
        config => {
            // 登录流程控制中，根据本地是否存在token判断用户的登录情况        
            const token = store.state.token ? 'Bearer ' + store.state.token : ''
            token && (config.headers.Authorization = token)
            return config
        },
        error => Promise.error(error))
    // 响应拦截器
instance.interceptors.response.use(
    // 请求成功
    res => {
        // closeLoading()
        let Res = res.data
        return new Promise((resolve, reject) => {
            if (Res.code === 200) {
                // Message({
                //     message: Res.msg,
                //     type: 'success'
                // });
                resolve(Res)
            } else {
                errorHandle(Res.code, Res.msg)
                setTimeout(() => {
                    reject(Res)
                }, 0)
            }
        })
    },
    // 请求失败
    error => {
        // closeLoading()
        const { response } = error
        if (response) {
            // 请求已发出，但是不在2xx的范围 
            errorHandle(response.status, response.data.msg)
            setTimeout(() => {
                return Promise.reject(response.data)
            }, 0)
        } else {
            // 处理断网的情况
            // eg:请求超时或断网时，更新state的network状态
            // network状态在app.vue中控制着一个全局的断网提示组件的显示隐藏
            // 关于断网组件中的刷新重新获取数据，会在断网组件中说明
            console.log("断网")
            setTimeout(() => {
                return Promise.reject()
            }, 0)
        }
    })
export function get(url, params) {
    return new Promise((resolve, reject) => {
        instance.get(url, {
                params: params
            })
            .then(res => {
                resolve(res)
            })
            .catch(err => {
                reject(err)
            })
    })
}
/** 
 * post方法，对应post请求 
 * @param {String} url [请求的url地址] 
 * @param {Object} params [请求时携带的参数] 
 */
export function post(url, params) {
    return new Promise((resolve, reject) => {
        instance.post(url, params)
            .then(res => {
                resolve(res)
            })
            .catch(err => {
                reject(err)
            })
    })
}